<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 基本概念：ES6 允许按照一定模式，从数组和对象中提取值，对变量进行赋值，这被称为解构
      // 【1】数组的解构赋值
      // （1）es5中，为变量赋值，只能直接指定值
      let a = 1;
      let b = 2;
      let c = 3;
      // ES6 允许写成下面这样:
      let [a, b, c] = [1, 2, 3];//上面代码表示，可以从数组中提取值，按照对应位置，对变量赋值。
      // 本质上，这种写法属于“模式匹配”，只要等号两边的模式相同，
      // 左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。
      // 比如下面：
      // （1-1）let [foo, [[bar], baz]] = [1, [[2], 3]];
      //     foo // 1
      //     bar // 2
      //     baz // 3
      // （1-2）let [head, ...tail] = [1, 2, 3, 4];
      //     head // 1
      //     tail // [2, 3, 4]
      // （1-3）let [x, y, ...z] = ['a'];
      //     x // "a"
      //     y // undefined
      //     z // []
      // （2）解构不成功
      // 下面两种都是解构不成功，此时变量的值都是undefined
      // let [foo] = []; 
      // let [bar, foo] = [1];
      // （3）不完全解构
      // 另一种情况是不完全解构，即等号左边的模式，只匹配一部分的等号右边的数组。这种情况下，解构依然可以成功
      // let [x, y] = [1, 2, 3];
      // x // 1
      // y // 2

      // let [a, [b], d] = [1, [2, 3], 4];
      // a // 1
      // b // 2
      // d // 4
      // （3）解构报错
      // 如果等号的右边不是数组（或者严格地说，不是可遍历的结构，参见《Iterator》一章），那么将会报错。
      // let [foo] = 1;
      // let [foo] = false;
      // let [foo] = NaN;
      // let [foo] = undefined;
      // let [foo] = null;
      // let [foo] = {};

    </script>
  </body>
</html>
